#!/bin/bash

# 颜色定义
GREEN='\033[0;32m'
RED='\033[0;31m'
YELLOW='\033[0;33m'
NC='\033[0m' # 无颜色

# 日志函数
log_info() {
    echo -e "${GREEN}[INFO]${NC} $1"
}

log_warn() {
    echo -e "${YELLOW}[WARN]${NC} $1"
}

log_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

# 检查是否为root用户
if [ "$(id -u)" != "0" ]; then
   log_error "此脚本必须以root权限运行" 
   exit 1
fi

# 设置环境变量
APP_DIR="/var/www/box-user"
BACKUP_DIR="/var/backups/box-user/$(date +%Y%m%d_%H%M%S)"
LOG_FILE="/var/log/box-user/deploy_$(date +%Y%m%d_%H%M%S).log"

# 确保日志目录存在
mkdir -p "$(dirname "$LOG_FILE")"

# 将所有输出重定向到日志文件
exec > >(tee -a "$LOG_FILE") 2>&1

log_info "开始自动化部署流程..."
log_info "应用目录: $APP_DIR"
log_info "备份目录: $BACKUP_DIR"
log_info "日志文件: $LOG_FILE"

# 检查应用目录是否存在
if [ ! -d "$APP_DIR" ]; then
    log_error "应用目录 $APP_DIR 不存在！请先运行初始部署脚本。"
    exit 1
fi

# 创建备份
log_info "创建应用备份..."
mkdir -p "$BACKUP_DIR"
cp -r "$APP_DIR"/* "$BACKUP_DIR"/
log_info "备份已保存到: $BACKUP_DIR"

# 进入应用目录
cd "$APP_DIR" || {
    log_error "无法进入应用目录！"
    exit 1
}

# 检查是否是Git仓库
if [ ! -d ".git" ]; then
    log_warn "目录不是Git仓库，跳过代码更新步骤"
else
    # 保存当前分支名
    CURRENT_BRANCH=$(git rev-parse --abbrev-ref HEAD)
    log_info "当前分支: $CURRENT_BRANCH"

    # 提示用户选择更新方式
    read -p "选择更新方式: [1] git pull当前分支 [2] 切换到指定分支/标签 [3] 跳过代码更新 (默认: 1): " UPDATE_CHOICE
    UPDATE_CHOICE=${UPDATE_CHOICE:-1}

    case $UPDATE_CHOICE in
        1)
            # 拉取最新代码
            log_info "从当前分支 $CURRENT_BRANCH 拉取最新代码..."
            git fetch --all
            git reset --hard origin/"$CURRENT_BRANCH"
            git pull
            ;;
        2)
            # 切换到指定分支/标签
            read -p "输入要切换到的分支或标签名: " TARGET_BRANCH
            log_info "切换到 $TARGET_BRANCH..."
            git fetch --all
            git checkout "$TARGET_BRANCH"
            ;;
        3)
            log_info "跳过代码更新"
            ;;
        *)
            log_warn "无效选择，使用默认选项: 从当前分支拉取"
            git fetch --all
            git reset --hard origin/"$CURRENT_BRANCH"
            git pull
            ;;
    esac
fi

# 激活虚拟环境
log_info "激活虚拟环境..."
source venv/bin/activate || {
    log_error "无法激活虚拟环境！"
    exit 1
}

# 安装/更新依赖
log_info "更新Python依赖..."
pip install --upgrade pip
pip install -r requirements.txt

# 设置Django环境变量
export DJANGO_SETTINGS_MODULE=boxuser.settings

# 执行数据库迁移
log_info "检查和应用数据库迁移..."
python manage.py makemigrations
if [ $? -ne 0 ]; then
    log_error "生成迁移失败！正在回滚部署..."
    cd "$BACKUP_DIR" || exit 1
    cp -r * "$APP_DIR"/
    log_error "已回滚到之前的版本。请检查数据库模型错误后重试。"
    exit 1
fi

python manage.py migrate
if [ $? -ne 0 ]; then
    log_error "应用迁移失败！正在回滚部署..."
    cd "$BACKUP_DIR" || exit 1
    cp -r * "$APP_DIR"/
    log_error "已回滚到之前的版本。请检查数据库迁移错误后重试。"
    exit 1
fi

# 收集静态文件
log_info "收集静态文件..."
python manage.py collectstatic --noinput
if [ $? -ne 0 ]; then
    log_error "收集静态文件失败！"
fi

# 检查配置
log_info "检查配置文件..."
if ! grep -q "DEBUG = False" boxuser/settings.py 2>/dev/null; then
    log_warn "警告: 在settings.py中未找到DEBUG = False，生产环境不应启用调试模式。"
    log_info "查看当前的DEBUG设置:"
    grep -n "DEBUG" boxuser/settings.py 2>/dev/null
fi

# 重启应用
log_info "重启应用服务..."
supervisorctl restart box-user

# 验证服务状态
log_info "验证服务状态..."
sleep 5 # 等待服务启动
supervisor_status=$(supervisorctl status box-user)
echo "$supervisor_status"

if echo "$supervisor_status" | grep -q "RUNNING"; then
    # 检查应用是否真正可访问
    log_info "服务已成功重启，正在验证应用可访问性..."
    CURL_RESULT=$(curl -s -o /dev/null -w "%{http_code}" http://localhost:8000/admin/)
    
    if [ "$CURL_RESULT" = "200" ] || [ "$CURL_RESULT" = "302" ]; then
        log_info "应用验证成功! HTTP状态码: $CURL_RESULT"
    else
        log_warn "应用可能未正常运行，HTTP状态码: $CURL_RESULT"
        log_info "正在查看应用日志..."
        tail -n 50 /var/log/box-user/supervisor.err.log
    fi
else
    log_error "服务启动失败！"
    log_info "正在查看应用日志..."
    tail -n 50 /var/log/box-user/supervisor.err.log
fi

# 清理旧备份（可选）
read -p "是否清理30天前的旧备份? (y/n, 默认: n): " CLEAN_BACKUPS
if [ "${CLEAN_BACKUPS,,}" = "y" ]; then
    log_info "清理30天前的旧备份..."
    find /var/backups/box-user -type d -mtime +30 -exec rm -rf {} \; 2>/dev/null
    log_info "旧备份清理完成"
fi

log_info "部署过程完成!"
log_info "部署日志保存在: $LOG_FILE"

# 显示Nginx状态
nginx_status=$(systemctl status nginx | grep "Active:")
echo "Nginx状态: $nginx_status"

# 部署摘要
log_info "============= 部署摘要 ============="
log_info "部署时间: $(date)"
log_info "部署版本: $(git describe --always --tags 2>/dev/null || echo 'Unknown')"
log_info "数据库状态: OK"
log_info "应用状态: $(supervisorctl status box-user | awk '{print $2}')"
log_info "=====================================" 